import bcrypt
from datetime import datetime
from model.entity import User  # 确保正确导入 User 类


class UserService:
    def __init__(self, mysql):
        self.mysql = mysql  # mysql 应包含数据库连接配置

    def register_user(self, user):
        """用户注册逻辑：加密密码并写入数据库，严格处理 gender 字段为固定单字符"""
        # 1. 基础校验
        if not user.username or not user.password:
            print("注册失败：用户名和密码为必填项")
            return False

        # 2. 强制处理 gender 为固定单字符 'U'（彻底避免长度问题）
        user.gender = 'U'  # 直接设置为固定值，可根据需求调整为 'M'/'F' 等单字符

        # 3. 使用 bcrypt 加密密码
        hashed_pwd = bcrypt.hashpw(
            user.password.encode('utf-8'),
            bcrypt.gensalt()
        ).decode('utf-8')

        # 4. 获取数据库连接并执行操作
        conn = self.mysql.connection  # 确保 self.mysql 包含有效的数据库连接
        cursor = conn.cursor()

        # 5. 构造 SQL 语句和参数
        sql = """INSERT INTO users (username, password, age, gender, height, weight, 
                 diabetes_type, hypertension, smoking_history, genetic_factor, 
                 created_at, updated_at) 
                 VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""
        values = (
            user.username, hashed_pwd, user.age, user.gender,
            user.height, user.weight, user.diabetes_type,
            user.hypertension, user.smoking_history, user.genetic_factor,
            datetime.now(), datetime.now()
        )

        # 6. 执行 SQL 并处理异常，添加详细调试信息
        try:
            # 打印即将执行的 SQL 和参数（调试用）
            print(f"即将执行的 SQL: {sql}")
            print(f"即将插入的参数: {values}")

            cursor.execute(sql, values)
            conn.commit()
            print("注册成功：数据已提交")
            return True
        except Exception as e:
            # 详细打印异常信息
            print(f"注册失败: {str(e)}（可能原因：用户名重复、数据库连接异常等）")
            conn.rollback()
            return False
        finally:
            cursor.close()

    def login_user(self, username, password):
        """用户登录逻辑：校验密码，返回用户ID"""
        conn = self.mysql.connection
        cursor = conn.cursor()

        sql = "SELECT id, password FROM users WHERE username = %s"
        try:
            cursor.execute(sql, (username,))
            result = cursor.fetchone()
            if result:
                user_id, stored_pwd = result
                # 用 bcrypt 验证密码（自动处理盐值）
                if bcrypt.checkpw(password.encode('utf-8'), stored_pwd.encode('utf-8')):
                    return user_id
                else:
                    print("登录失败：密码不匹配")
            else:
                print("登录失败：用户不存在")
        except Exception as e:
            print(f"登录失败: {str(e)}（可能原因：数据库连接异常）")
        finally:
            cursor.close()
        return None

    def get_user_info(self, user_id):
        """根据用户ID查询信息，映射表字段到 User 实体"""
        conn = self.mysql.connection
        cursor = conn.cursor()

        sql = """SELECT id, username, age, gender, height, weight, diabetes_type, 
                 hypertension, smoking_history, genetic_factor, created_at, updated_at 
                 FROM users WHERE id = %s"""
        try:
            cursor.execute(sql, (user_id,))
            row = cursor.fetchone()
            if row:
                return User(
                    id=row[0],
                    username=row[1],
                    age=row[2],
                    gender=row[3],
                    height=row[4],
                    weight=row[5],
                    diabetes_type=row[6],
                    hypertension=row[7],
                    smoking_history=row[8],
                    genetic_factor=row[9],
                    created_at=row[10],
                    updated_at=row[11],
                    password=""  # 密码敏感，不返回
                )
            else:
                print("查询失败：用户ID不存在")
        except Exception as e:
            print(f"查询失败: {str(e)}（可能原因：数据库连接异常）")
        finally:
            cursor.close()
        return None

    def update_user_info(self, user):
        """更新用户信息：根据ID修改，严格处理 gender 字段为固定单字符"""
        # 1. 校验用户ID
        if not user.id:
            print("更新失败：用户ID为空，无法定位记录")
            return False

        # 2. 强制处理 gender 为固定单字符 'U'
        user.gender = 'U'  # 直接设置为固定值

        # 3. 获取数据库连接并执行操作
        conn = self.mysql.connection
        cursor = conn.cursor()

        # 4. 构造 SQL 语句和参数
        sql = """UPDATE users SET age = %s, gender = %s, height = %s, weight = %s, 
                 diabetes_type = %s, hypertension = %s, smoking_history = %s, 
                 genetic_factor = %s, updated_at = %s WHERE id = %s"""
        values = (
            user.age, user.gender, user.height, user.weight,
            user.diabetes_type, user.hypertension,
            user.smoking_history, user.genetic_factor,
            datetime.now(), user.id
        )

        # 5. 执行 SQL 并处理异常，添加详细调试信息
        try:
            # 打印即将执行的 SQL 和参数（调试用）
            print(f"即将执行的 SQL: {sql}")
            print(f"即将更新的参数: {values}")

            cursor.execute(sql, values)
            conn.commit()
            print("更新成功：数据已提交")
            return True
        except Exception as e:
            # 详细打印异常信息
            print(f"更新失败: {str(e)}（可能原因：字段类型错误、ID不存在等）")
            conn.rollback()
            return False
        finally:
            cursor.close()